package com.uusee.framework.bo;

import java.io.Serializable;
import java.util.List;

import com.uusee.framework.util.query.CriteriaInfo;
import com.uusee.framework.util.query.QueryReturnObject;

/**
 * 业务逻辑基础接口
 * 
 * @author <a href="mailto:wangr.bj@gmail.com">WangRui</a> <a href="mailto:du_yi@bbn.cn">DuYi</a>
 */
public interface UniversalBo {
	/**
	 * 获得所有实体
	 * 
	 * @param <T>
	 * @param clazz
	 * @return
	 */
	<T> List<T> getAll(Class<T> clazz);

	/**
	 * 通过ID得实体
	 * 
	 * @param <T>
	 * @param clazz
	 * @param id
	 * @return
	 */
	<T> T getById(Class<T> clazz, Serializable id);

	/**
	 * 持久化实体
	 * 
	 * @param <T>
	 * @param o
	 * @return
	 */
	<T> T doSave(T o);

	/**
	 * 删除实体
	 * 
	 * @param <T>
	 * @param clazz
	 * @param id
	 */
	<T> void doDelete(Class<T> clazz, Serializable id);

	/**
	 * 更新实体
	 * 
	 * @param <T>
	 * @param o
	 */
	<T> void doUpdate(T o);

	/**
	 * 合并实体
	 * 
	 * @param <T>
	 * @param o
	 * @return
	 */
	<T> T doMerge(T o);

	/**
	 * 得实体总数
	 * 
	 * @param <T>
	 * @param modelClass
	 * @return
	 */
	<T> int getCount(Class<T> modelClass);

	/**
	 * 得分页的查询返回对象
	 * 
	 * @param <T>
	 * @param modelClass
	 * @param pageNo
	 * @param offset
	 * @return
	 */
	<T> QueryReturnObject<T> getQueryReturnObject(Class<T> modelClass, int pageNo, int offset);


	/**
	 * 按CriteriaInfo得实体数量
	 * 
	 * @param <T>
	 * @param modelClass
	 * @param ci
	 * @return
	 */
	public <T> int getCountByCriteriaInfo(Class<T> modelClass, CriteriaInfo ci);

	/**
	 * 按CriteriaInfo得实体列表
	 * 
	 * @param <T>
	 * @param modelClass
	 * @param ci
	 * @return
	 */
	public <T> List<T> getEntitiesByCriteriaInfo(Class<T> modelClass, CriteriaInfo ci);

	/**
	 * 按CriteriaInfo得查询集结对象
	 * 
	 * @param <T>
	 * @param modelClass
	 * @param ci
	 * @return
	 */
	public <T> QueryReturnObject<T> getQueryReturnObjectByCriteriaInfo(Class<T> modelClass, CriteriaInfo ci);
}
